import MaterialApi from '@/api/user/material';
import File from './file/file.js';
import Storage from '@/utils/storage.js'
export default {
	mixins: [File],
	props: {
		material: {
			type: Object,
			default: () => {}
		}
	},
	data() {
		return {
			showProgress: false, // 进度条
			file: {},
		}
	},
	methods: {

		// 加载数据
		load: async function() {
			let res = await MaterialApi.preview(this.material.id);
			this.file = res.obj || {};
			this.file.id = this.material.id;
			this.file.name = this.material.name;
			return this.file;
		},

		// 检查缓存文件
		_loadTempFile: function(file) {
			let self = this;
			return new Promise((resolve, reject) => {

				// 检查缓存文件
				let temp = Storage.get(file.id)
				console.log("检查缓存")
				console.log(temp)

				// 如果有缓存文件
				if (temp && temp.filePath) {
					uni.getFileInfo({
						filePath: temp.filePath,
						success(res) {
							self.$set(file, 'filePath', temp.filePath)
							resolve(temp);
						},
						fail(e) {
							Storage.remove(file.id);
							resolve();
						}
					});
				}
				// 没有文件
				else {
					resolve();
				}
			});
		},

		// 下载文件
		_doDownload: function(file) {
			let self = this;
			return new Promise((resolve, reject) => {
				let uploadTask = uni.downloadFile({
					url: file.signedUrl,
					success: function(res) {
						if (res.statusCode != 200) {
							reject(new Error('下载错误:' + JSON.stringify(res)))
							return;
						}
						self.$set(file, 'filePath', res.tempFilePath)
						Storage.set(file.id, {
							id: file.id,
							name: file.name,
							filePath: file.filePath
						}, 7 * 86400)
						resolve();
					},
					fail: function(err) {
						reject(err);
					},
				});

				// 监听文件上传进度
				file.uploadTask = uploadTask
				uploadTask.onProgressUpdate(async function(res) {
					self.$set(file, 'progress', res.progress)
					file.uploadInfo = res
				});
			});
		},

		// 结束下载
		finishDownload: function(file) {
			return new Promise((resolve) => {
				setTimeout(() => {
					try {
						this.showProgress = false;
						this.$emit("download:end", true);
					} finally {
						resolve();
					}
				}, 2000);
			});
		},

		// 下载文件
		doDownload: async function() {
			this.showProgress = true;
			console.log('#########下载文件#########')

			// 获取数据
			let file = await this.load();
			console.log(file)

			// 下载文件
			try {

				// 本地缓存文件
				let temp = await this._loadTempFile(file);
				console.log("缓存结果")
				console.log(temp)

				// 远端下载文件
				if (!temp) {
					await this._doDownload(file);
				}
				this.$set(file, 'progress', 100);
				this.$set(file, 'status', 1); // 成功
				console.log("下载成功")
			} catch (e) {
				this.$set(file, 'status', 3); // 失败
				console.log("下载失败：")
				console.log(e)
			}

			// 结束下载
			await this.finishDownload(file);
			console.log('#########################')
		},

		// 下载文件
		downloadFile: async function() {
			// 下载文件
			await this.doDownload();
			if (this.file.status === 1) {
				this.$app.success('下载成功！')
			} else {
				this.$app.error('下载失败！')
			}
		},

		// 打开文件
		openFile: async function() {
			let self = this;
			// 下载文件
			await this.doDownload();
			console.log("打开文件")
			console.log(this.file)
			if (this.file.status === 1) {
				uni.openDocument({
					filePath: this.file.filePath,
					showMenu: true,
					success: function(res) {
						self.$app.success('打开文档成功！')
					},
					fail: function(e) {
						console.log(e)
						self.$app.error('打开文档失败！')
					}
				});
			} else {
				self.$app.error('打开文档失败！')
			}
		},

		// 保存文件
		saveFile: async function() {
			let self = this;

			// 下载文件
			await this.doDownload();

			// 根据文件的类型保存到相应的地方
			if (this.file.status === 1) {
				if (this.imageAble) {
					uni.saveImageToPhotosAlbum({
						filePath: this.file.filePath,
						success: function() {
							self.$app.error('保存图片成功！')
						},
						fail: function(e) {
							console.log(e)
							self.$app.error('保存图片失败！')
						}
					});
				} else if (this.videoAble) {
					uni.saveVideoToPhotosAlbum({
						filePath: this.file.filePath,
						success: function() {
							self.$app.error('保存视频成功！')
						},
						fail: function(e) {
							console.log(e)
							self.$app.error('保存视频失败！')
						}
					});
				} else {
					self.$app.error('仅支持图片和视频的保存！')
				}
			} else {
				self.$app.error('保存失败！')
			}
		}
	}
}
